package com.example.demo.util.redis;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Redis List类型操作工具类
 */
@Component
public class RedisListUtil {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 获取list缓存的内容
     * @param key 键
     * @param start 开始
     * @param end 结束
     * @return 列表
     */
    public List<Object> range(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }

    /**
     * 获取list缓存的长度
     * @param key 键
     * @return 长度
     */
    public Long size(String key) {
        return redisTemplate.opsForList().size(key);
    }

    /**
     * 通过索引获取list中的值
     * @param key 键
     * @param index 索引
     * @return 值
     */
    public Object index(String key, long index) {
        return redisTemplate.opsForList().index(key, index);
    }

    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @return 长度
     */
    public Long rightPush(String key, Object value) {
        return redisTemplate.opsForList().rightPush(key, value);
    }

    /**
     * 将list放入缓存并设置过期时间
     * @param key 键
     * @param value 值
     * @param timeout 过期时间
     * @param unit 时间单位
     * @return 长度
     */
    public Long rightPush(String key, Object value, long timeout, TimeUnit unit) {
        Long size = redisTemplate.opsForList().rightPush(key, value);
        redisTemplate.expire(key, timeout, unit);
        return size;
    }

    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @return 长度
     */
    public Long rightPushAll(String key, Object... value) {
        return redisTemplate.opsForList().rightPushAll(key, value);
    }

    /**
     * 将list放入缓存并设置过期时间
     * @param key 键
     * @param timeout 过期时间
     * @param unit 时间单位
     * @param value 值
     * @return 长度
     */
    public Long rightPushAll(String key, long timeout, TimeUnit unit, Object... value) {
        Long size = redisTemplate.opsForList().rightPushAll(key, value);
        redisTemplate.expire(key, timeout, unit);
        return size;
    }

    /**
     * 根据索引修改list中的某条数据
     * @param key 键
     * @param index 索引
     * @param value 值
     */
    public void set(String key, long index, Object value) {
        redisTemplate.opsForList().set(key, index, value);
    }

    /**
     * 移除N个值为value
     * @param key 键
     * @param count 移除多少个
     * @param value 值
     * @return 移除的个数
     */
    public Long remove(String key, long count, Object value) {
        return redisTemplate.opsForList().remove(key, count, value);
    }
} 